package com.mybatis.mapper;

import com.mybatis.pojo.User;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * Copyright (c) 2023-2033 All Rights Reserved
 *
 * MyBatis执行特殊SQL
 *
 * TODO：
 *  0. 区分 #{param} ${param} 的使用场景，重点关注XML映射文件SQL中 ${param}的使用
 *  1. 模糊搜索，LIKE语句，使用手动双引号拼接的方式 ```like "%"#{username}"%"```
 *  2. 批量删除，IN 语句，不能使用 #{} 默认添加了单引号 ''，只能用 ${}，```id in (${ids})```
 *  3. 动态设置表名，表名不能加单引号，只能使用 ${tablename}，```from ${tablename}```
 *  4. 添加并获取自增主键值，插入操作返回值固定 int 表示影响的行数，通过设置属性值```useGeneratedKeys、keyProperty```获取
 *
 * @date: 2023/10/16
 */
public interface SQLMapper {

    /**
     * 模糊搜索
     * 1. LIKE语句，使用 like '#{%username%}'相当于 like '?' 自动添加单引号，?无法作为占位符使用
     * 2. 使用拼接字符串方式 '%${username}%'
     * 3. 使用concat()拼接 concat('%', #{username}, '%')
     * 4. 推荐使用手动双引号拼接 "%"#{username}"%"
     *
     * @param username
     * @return
     */
    List<User> getUserAllByLike(String username);

    /**
     * 批量删除用户
     * @param ids
     */
    int deleteUser(@Param("ids") String ids);

    /**
     * 动态设置表名
     */
    List<User> getUserAll(@Param("tablename") String tablename);

    /**
     * 添加并获取自增主键值
     * 场景：添加班级，需要先获取新添加的自动生成的班级id，再为班级分配学生
     * 1. 插入操作返回值固定 int 表示影响的行数，无法返回生成的主键
     * 2. 通过在SQL语句上添加控制字段获取
     */
    int insertUser(User user);
}
